<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script>
      /* 
            对象中存储属性的区域实际有两个:
                1.对象自身
                    -只通过对象添加的属性,位于对象自身中
                    -在类中通过X = Y 的形式添加的属性,位于对象自身中
                
                2.原型对象(prototype)
                    -喜爱你个中还有一些内容会存储到其他对象里(原形对象)
                    -在对象中会有一个属性用来存储对象,这个属性叫做__proto__
                    -原形对象也会负责为对象存储属性,
                        当我们访问对象中的属性时,会有限访问对象自身的属性,
                        对象自身不包括该属性的时候,才会去原形对象中去寻找
                    -会添加到原形对象中的情况:
                        1.在类中通过XXX(){}方式添加的方法,位于原形中
                        2.主动向原形添加的属性和方法
        */
      class Person {
        name = 'GG';
        age = 22;
        constructor() {
          console.log('XX' + this.name);
        }
        sayHello() {
          console.log('ni hao');
        }
      }
      const p = new Person();
      console.log(p);
      p.GG = 'ee';
      Person.sayHello = () => {
        console.log('GG');
      };
      console.log(p);
      Person.sayHello();
      Person.RR = 22;
      console.log(p);
      console.log(p.RR);

      /* 
            访问一个对象的原型对象
                对象.__proto__
                Object.getPrototypeOf(对象)
            
            原型对象中的数据:
                1.对象中的数据(属性,方法)
                2.constructor(对象的构造函数)
            
            注意
                原型对象也有原型,这样就构成了一条原型链,根据对象的复杂程度不同,原型链的长度也不同
                    p对象的原型链:p对象 => 原型    => 原型 => null
                    obj对象的原型链: obj对象 => 原型 => null

                原型链:
                    -读取对象属性时,会优先对象自身属性
                        如果对象中由,则使用,没有则去U对象的原型中寻找
                        如果原型中由,则使用,没有则去原型的原型中寻找
                        直到找到Object对象的原型(Object的原型中没有原型(为null))
                            如果依旧没有找到,则返回undefined
                    作用域链:去寻找变量的链,找不到就报错
                    原型链:寻找属性的连,找不到就返回undefined    
        */
        console.log(p.__proto__.__proto__.__proto__);
        console.log(Object.getPrototypeOf(p));
        const GG ={
            name:"GG"
        }
        console.log(Object.getPrototypeOf(Object.getPrototypeOf(GG)));

    </script>
  </head>
  <body></body>
</html>
